package shm.capaDatos.entidades;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import shm.capaDatos.vo.CategoriaStakeholderVO;
import shm.capaDatos.vo.CompromisoVO;
import shm.capaDatos.vo.ConocimientoProcesosNegocioVO;
import shm.capaDatos.vo.DatosContactoVO;
import shm.capaDatos.vo.DisposicionVO;
import shm.capaDatos.vo.EntendimientoRequerimientosVO;
import shm.capaDatos.vo.EstadoStakeholderVO;
import shm.capaDatos.vo.GrupoVO;
import shm.capaDatos.vo.ImpactoProyectoVO;
import shm.capaDatos.vo.InfluenciaVO;
import shm.capaDatos.vo.OrganizacionVO;
import shm.capaDatos.vo.PersonaVO;
import shm.capaDatos.vo.PoderVO;
import shm.capaDatos.vo.PreocupacionVO;
import shm.capaDatos.vo.ProximidadVO;
import shm.capaDatos.vo.ProyectoVO;
import shm.capaDatos.vo.ReceptividadVO;
import shm.capaDatos.vo.StakeholderVO;
import shm.capaDatos.vo.TipoStakeholderVO;
import shm.capaDatos.vo.UsuarioVO;

@Entity
public class Stakeholder implements Serializable{
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id; 
	@Column(nullable = true, unique = false)
	private Integer idHistorico;
	@ManyToOne
	@JoinColumn(name="categoriaStakeholder_id", nullable = false)
	private CategoriaStakeholder categoriaStakeholder;
	@ManyToOne
	@JoinColumn(name="proyecto_id", nullable = false)
	private Proyecto proyecto;
	@Column(length=255,nullable = true, unique = false)
	private String beneficiosProyecto;
	@Column(length=255,nullable = true, unique = false)
	private String perjuiciosProyecto;
	@ManyToOne
	private ImpactoProyecto impactoProyecto;
	@ManyToOne(fetch = FetchType.EAGER)
	private DatosContacto datosContactoDelegado;
	@ManyToOne
	@JoinColumn(name="tipoStakeholder_id", nullable = false)
	private TipoStakeholder tipoStakeholder;
	@ManyToOne
	private Poder poder; 
	@ManyToOne
	private Preocupacion preocupacion; 
	@ManyToOne
	private Compromiso compromiso; 
	@ManyToOne
	private Disposicion disposicion; 
	@Column(length=255,nullable = true, unique = false)
	private String estrategiaGerenciamiento; 
	@ManyToOne
	private Influencia influencia; 
	@ManyToOne
	private Proximidad proximidad; 
	@ManyToOne
	private Receptividad receptividad; 
	@Column(length=255,nullable = true, unique = false)
	private String descripcion;
	@ManyToOne(fetch = FetchType.EAGER)
	private DatosContacto datosContacto;
	@ManyToOne
	private EntendimientoRequerimientos entendimientoRequerimientos;
	@ManyToOne
	private ConocimientoProcesosNegocio conocimientoProcesosNegocioFuncion;
	@ManyToOne
	@JoinColumn(name="estado_id", nullable = false)
	private EstadoStakeholder estado;
	@Embedded
	private DatosAuditoria datosAuditoria;
	private static final long serialVersionUID = 1L;
	
	public StakeholderVO getVO(){
		StakeholderVO stakeholderVO  = new StakeholderVO() ;
		stakeholderVO.setId(this.id);
		stakeholderVO.setIdHistorico(this.idHistorico);
		if(this.categoriaStakeholder != null){
			stakeholderVO.setCategoriaStakeholder(this.categoriaStakeholder.getVO());
		}
		if(this.proyecto != null){
			stakeholderVO.setProyecto(this.proyecto.getVO());
		}
		stakeholderVO.setBeneficiosProyecto(this.beneficiosProyecto);
		stakeholderVO.setPerjuiciosProyecto(this.perjuiciosProyecto);
		if(this.impactoProyecto != null){
			stakeholderVO.setImpactoProyecto(this.impactoProyecto.getVO());
		}		
		if(this.datosContactoDelegado != null){
			stakeholderVO.setDatosContactoDelegado(this.datosContactoDelegado.getVO());
		}
		if(this.tipoStakeholder != null){
			stakeholderVO.setTipoStakeholder(this.tipoStakeholder.getVO());
		}

		if(this.poder != null){
			stakeholderVO.setPoder(this.poder.getVO());
		}
		if(this.preocupacion !=null){
			stakeholderVO.setPreocupacion(this.preocupacion.getVO());
		}
		if(this.compromiso!= null){
			stakeholderVO.setCompromiso(this.compromiso.getVO());
		}
		if(this.disposicion != null){
			stakeholderVO.setDisposicion(this.disposicion.getVO());
		}
		
		stakeholderVO.setEstrategiaGerenciamiento(this.estrategiaGerenciamiento);
		
		if(this.influencia != null){
			stakeholderVO.setInfluencia(this.influencia.getVO());
		}
		if(this.proximidad!= null){
			stakeholderVO.setProximidad(this.proximidad.getVO());
		}
		if(this.receptividad != null){
			stakeholderVO.setReceptividad(this.receptividad.getVO());
		}
		stakeholderVO.setDescripcion(this.descripcion);
		if(this.datosContacto != null){
			stakeholderVO.setDatosContacto(this.datosContacto.getVO());
		}
		if(this.entendimientoRequerimientos != null){
			stakeholderVO.setEntendimientoRequerimientos(this.entendimientoRequerimientos.getVO());
		}
		if(this.conocimientoProcesosNegocioFuncion != null){
			stakeholderVO.setConocimientoProcesosNegocioFuncion(this.conocimientoProcesosNegocioFuncion.getVO());
		}
		if(this.estado != null){
			stakeholderVO.setEstado(this.estado.getVO());
		}		
		if(this.datosAuditoria != null){
			stakeholderVO.setDatosAuditoria(this.datosAuditoria.getVO());
		}
		return stakeholderVO;
	}
	public void setVO(StakeholderVO stakeholderVO){
		if(stakeholderVO != null){
			DatosContactoVO datosContactoDelegadoVO = stakeholderVO.getDatosContactoDelegado();
			ProyectoVO proyectoVO = stakeholderVO.getProyecto();
			ImpactoProyectoVO impactoProyectoVO = stakeholderVO.getImpactoProyecto();
			TipoStakeholderVO tipoStakeholderVO = stakeholderVO.getTipoStakeholder();
			PoderVO poderVO = stakeholderVO.getPoder();
			PreocupacionVO preocupacionVO = stakeholderVO.getPreocupacion();
			CompromisoVO compromisoVO = stakeholderVO.getCompromiso();
			DisposicionVO disposicionVO = stakeholderVO.getDisposicion();
			InfluenciaVO influenciaVO = stakeholderVO.getInfluencia();
			ProximidadVO proximidadVO = stakeholderVO.getProximidad();
			ReceptividadVO receptividadVO = stakeholderVO.getReceptividad();
			DatosContactoVO datosContactoVO = stakeholderVO.getDatosContacto();
			EntendimientoRequerimientosVO entendimientoRequerimientosVO = stakeholderVO.getEntendimientoRequerimientos();
			ConocimientoProcesosNegocioVO conocimientoProcesosNegocioFuncionVO = stakeholderVO.getConocimientoProcesosNegocioFuncion();
			EstadoStakeholderVO estadoVO = stakeholderVO.getEstado();
			
			this.id = stakeholderVO.getId();
			CategoriaStakeholderVO categoriaStakeholderVO = stakeholderVO.getCategoriaStakeholder(); 
			if(categoriaStakeholderVO!=null){
				if(categoriaStakeholderVO.getClass() == OrganizacionVO.class){
					Organizacion organizacion = new Organizacion();
					organizacion.setVO((OrganizacionVO)categoriaStakeholderVO);
					this.categoriaStakeholder = organizacion;
				}else{
					if(categoriaStakeholderVO.getClass() == PersonaVO.class){
						Persona persona = new Persona();
						persona.setVO((PersonaVO)categoriaStakeholderVO);
						this.categoriaStakeholder = persona;
					}else{
						Grupo grupo = new Grupo();
						grupo.setVO((GrupoVO)categoriaStakeholderVO);
						this.categoriaStakeholder = grupo;
					}
				}
			}else{
				this.categoriaStakeholder = null;
			}

			if(datosContactoDelegadoVO != null){
				if(this.datosContactoDelegado == null){
					this.datosContactoDelegado = new DatosContacto();
				}
				this.datosContactoDelegado.setVO(datosContactoDelegadoVO);
			}else{
				this.datosContactoDelegado = null;
			}
			if(proyectoVO != null){
				if(this.proyecto == null){
					this.proyecto = new Proyecto();
				}
				this.proyecto.setVO(proyectoVO);
			}
			this.beneficiosProyecto = stakeholderVO.getBeneficiosProyecto();
			this.perjuiciosProyecto = stakeholderVO.getPerjuiciosProyecto();
			if(impactoProyectoVO != null){
				if(this.impactoProyecto == null){
					this.impactoProyecto = new ImpactoProyecto();
				}
				this.impactoProyecto.setVO(impactoProyectoVO);
			}
			if(tipoStakeholderVO != null){
				if(this.tipoStakeholder == null){
					this.tipoStakeholder = new TipoStakeholder();
				}
				this.tipoStakeholder.setVO(tipoStakeholderVO);
			}else{
				this.tipoStakeholder = null;
			}
			if(poderVO!= null){
				if(this.poder == null){
					this.poder = new Poder();
				}
				this.poder.setVO(poderVO);
			}else{
				this.poder = null;
			}
			if(preocupacionVO != null){
				if(this.preocupacion == null){
					this.preocupacion = new Preocupacion();
				}
				this.preocupacion.setVO(preocupacionVO);
			}else{
				this.preocupacion = null;
			}
			if(compromisoVO != null){
				if(this.compromiso == null){
					this.compromiso = new Compromiso();
				}
				this.compromiso.setVO(compromisoVO);
			}else{
				this.compromiso = null;
			}
			if(disposicionVO != null){
				if(this.disposicion == null){
					this.disposicion = new Disposicion();
				}
				this.disposicion.setVO(disposicionVO);
			}else{
				this.disposicion = null;
			}

			this.estrategiaGerenciamiento = stakeholderVO.getEstrategiaGerenciamiento();
			if(influenciaVO != null){
				if(this.influencia == null){
					this.influencia = new Influencia();
				}
				this.influencia.setVO(influenciaVO);
			}else{
				this.influencia = null;
			}
			if(proximidadVO != null){
				if(this.proximidad == null){
					this.proximidad = new Proximidad();
				}
				this.proximidad.setVO(proximidadVO);
			}else{
				this.proximidad = null;
			}
			if(receptividadVO != null){
				if(this.receptividad == null){
					this.receptividad = new Receptividad();
				}
				this.receptividad.setVO(receptividadVO);
			}else{
				this.receptividad = null;
			}
			this.descripcion = stakeholderVO.getDescripcion();
			if(datosContactoVO != null){
				if(this.datosContacto == null){
					this.datosContacto = new DatosContacto();
				}
				this.datosContacto.setVO(datosContactoVO);
			}else{
				this.datosContacto = null;
			}
			if(entendimientoRequerimientosVO != null){
				if(this.entendimientoRequerimientos == null){
					this.entendimientoRequerimientos = new EntendimientoRequerimientos();
				}
				this.entendimientoRequerimientos.setVO(entendimientoRequerimientosVO);
			}else{
				this.entendimientoRequerimientos = null;
			}
			if(conocimientoProcesosNegocioFuncionVO != null){
				if(this.conocimientoProcesosNegocioFuncion == null){
					this.conocimientoProcesosNegocioFuncion = new ConocimientoProcesosNegocio();
				}
				this.conocimientoProcesosNegocioFuncion.setVO(conocimientoProcesosNegocioFuncionVO);
			}else{
				this.conocimientoProcesosNegocioFuncion = null;
			}
			if(estadoVO != null){
				if(this.estado == null){
					this.estado = new EstadoStakeholder();
				}
				this.estado.setVO(estadoVO);
			}else{
				this.estado = null;
			}
		}
	}
	public void actualizacion(UsuarioVO usuarioActualizacion, Date fechaActualizacion){
		if(this.datosAuditoria == null){
			this.datosAuditoria = new DatosAuditoria();
		}
		this.datosAuditoria.actualizacion(usuarioActualizacion, fechaActualizacion);
	}
	public void creacion(UsuarioVO usuarioCreacion, Date fechaCreacion){
		this.actualizacion(usuarioCreacion, fechaCreacion);
		this.datosAuditoria.creacion(usuarioCreacion, fechaCreacion);
	}
	public void eliminacion(UsuarioVO usuarioEliminacion, Date fechaEliminacion){
		this.actualizacion(usuarioEliminacion, fechaEliminacion);
		this.datosAuditoria.eliminacion(usuarioEliminacion, fechaEliminacion);
	}
	public DatosAuditoria getDatosAuditoria() {
		return datosAuditoria;
	}
	public void setDatosAuditoria(DatosAuditoria datosAuditoria) {
		this.datosAuditoria = datosAuditoria;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getIdHistorico() {
		return idHistorico;
	}
	public void setIdHistorico(Integer idHistorico) {
		this.idHistorico = idHistorico;
	}
	
	public CategoriaStakeholder getCategoriaStakeholder() {
		return categoriaStakeholder;
	}
	public void setCategoriaStakeholder(CategoriaStakeholder categoriaStakeholder) {
		this.categoriaStakeholder = categoriaStakeholder;
	}
	public Proyecto getProyecto() {
		return proyecto;
	}
	public void setProyecto(Proyecto proyecto) {
		this.proyecto = proyecto;
	}
	public String getBeneficiosProyecto() {
		return beneficiosProyecto;
	}
	public void setBeneficiosProyecto(String beneficiosProyecto) {
		this.beneficiosProyecto = beneficiosProyecto;
	}
	public String getPerjuiciosProyecto() {
		return perjuiciosProyecto;
	}
	public void setPerjuiciosProyecto(String perjuiciosProyecto) {
		this.perjuiciosProyecto = perjuiciosProyecto;
	}
	public ImpactoProyecto getImpactoProyecto() {
		return impactoProyecto;
	}
	public void setImpactoProyecto(ImpactoProyecto impactoProyecto) {
		this.impactoProyecto = impactoProyecto;
	}
	public DatosContacto getDatosContactoDelegado() {
		return datosContactoDelegado;
	}
	public void setDatosContactoDelegado(DatosContacto datosContactoDelegado) {
		this.datosContactoDelegado = datosContactoDelegado;
	}
	public TipoStakeholder getTipoStakeholder() {
		return tipoStakeholder;
	}
	public void setTipoStakeholder(TipoStakeholder tipoStakeholder) {
		this.tipoStakeholder = tipoStakeholder;
	}
	public Poder getPoder() {
		return poder;
	}
	public void setPoder(Poder poder) {
		this.poder = poder;
	}
	public Preocupacion getPreocupacion() {
		return preocupacion;
	}
	public void setPreocupacion(Preocupacion preocupacion) {
		this.preocupacion = preocupacion;
	}
	public Compromiso getCompromiso() {
		return compromiso;
	}
	public void setCompromiso(Compromiso compromiso) {
		this.compromiso = compromiso;
	}
	public Disposicion getDisposicion() {
		return disposicion;
	}
	public void setDisposicion(Disposicion disposicion) {
		this.disposicion = disposicion;
	}
	public String getEstrategiaGerenciamiento() {
		return estrategiaGerenciamiento;
	}
	public void setEstrategiaGerenciamiento(String estrategiaGerenciamiento) {
		this.estrategiaGerenciamiento = estrategiaGerenciamiento;
	}
	public Influencia getInfluencia() {
		return influencia;
	}
	public void setInfluencia(Influencia influencia) {
		this.influencia = influencia;
	}
	public Proximidad getProximidad() {
		return proximidad;
	}
	public void setProximidad(Proximidad proximidad) {
		this.proximidad = proximidad;
	}
	public Receptividad getReceptividad() {
		return receptividad;
	}
	public void setReceptividad(Receptividad receptividad) {
		this.receptividad = receptividad;
	}
	public String getDescripcion() {
		return descripcion;
	}
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	public DatosContacto getDatosContacto() {
		return datosContacto;
	}
	public void setDatosContacto(DatosContacto datosContacto) {
		this.datosContacto = datosContacto;
	}
	public EntendimientoRequerimientos getEntendimientoRequerimientos() {
		return entendimientoRequerimientos;
	}
	public void setEntendimientoRequerimientos(
			EntendimientoRequerimientos entendimientoRequerimientos) {
		this.entendimientoRequerimientos = entendimientoRequerimientos;
	}
	public ConocimientoProcesosNegocio getConocimientoProcesosNegocioFuncion() {
		return conocimientoProcesosNegocioFuncion;
	}
	public void setConocimientoProcesosNegocioFuncion(
			ConocimientoProcesosNegocio conocimientoProcesosNegocioFuncion) {
		this.conocimientoProcesosNegocioFuncion = conocimientoProcesosNegocioFuncion;
	}
	public EstadoStakeholder getEstado() {
		return estado;
	}
	public void setEstado(EstadoStakeholder estado) {
		this.estado = estado;
	}
	public Boolean cambiaronDatosContacto(StakeholderVO stakeholder){
		if(stakeholder == null){
			if(this.datosContacto == null){
				return false;
			}else{
				return true;
			}
		}else{
			if(this.datosContacto == null && stakeholder.getDatosContacto() == null){
				return false;
			}else{
				if(this.datosContacto != null && stakeholder.getDatosContacto() != null){
					DatosContacto datosContacto = new DatosContacto();
					datosContacto.setVO(stakeholder.getDatosContacto());
					return !this.datosContacto.equals(datosContacto);
				}else{
					return true;
				}
			}
		}
	}
	public Boolean cambiaronDatosContactoDelegado(StakeholderVO stakeholder){
		if(stakeholder == null){
			if(this.datosContactoDelegado == null){
				return false;
			}else{
				return true;
			}
		}else{
			if(this.datosContactoDelegado == null && stakeholder.getDatosContactoDelegado() == null){
				return false;
			}else{
				if(this.datosContactoDelegado != null && stakeholder.getDatosContactoDelegado() != null){
					DatosContacto datosContactoDelegado = new DatosContacto();
					datosContactoDelegado.setVO(stakeholder.getDatosContactoDelegado());
					return !this.datosContactoDelegado.equals(datosContactoDelegado);
				}else{
					return true;
				}
			}
		}
	}
}
